package lucenepdf;

import java.io.File;
import java.util.ArrayList;
import java.util.Date;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopScoreDocCollector;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

import utils.DatosArchivo;

public class BuscaPdf {
	File indexDir = new File("c:\\indexdir");
    ArrayList<DatosArchivo> arr = new ArrayList<DatosArchivo>();
    String contenido;
    String autor;
    String fecha;
    
    public BuscaPdf(String contenido, String autor, String fecha){
    	this.contenido = contenido;
    	this.autor = autor;
    	this.fecha = fecha;
    }
	
  public ArrayList<DatosArchivo> resultado() throws Exception {
	Query queryAut = null;
	Query queryFecha = null;
	Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT);
	Directory fsDir = FSDirectory.open(indexDir);  
	IndexSearcher is = new IndexSearcher(fsDir);
	    
    if (!indexDir.exists() || !indexDir.isDirectory()) {
      throw new Exception(indexDir + " no existe o no es un directorio. ");
    }
    
   
    BooleanQuery busca = new BooleanQuery();
    
    if (autor.length()  != 0 ){
    	
    	QueryParser queryPA = new QueryParser(Version.LUCENE_CURRENT,"Autor", analyzer);
        queryAut = queryPA.parse(autor);
    	
       busca.add(queryAut, BooleanClause.Occur.MUST);
    }
    
    if (fecha.length() != 0){
    	QueryParser queryPF = new QueryParser(Version.LUCENE_CURRENT,"Fecha", analyzer);
    	queryFecha = queryPF.parse(fecha);
    	busca.add(queryFecha, BooleanClause.Occur.MUST);
    }
    
	QueryParser queryPCont = new QueryParser(Version.LUCENE_CURRENT,"Contenido", analyzer);
//    Query queryProd = QueryParser.parse(contenido,"Contenido", new StandardAnalyzer());   
	Query queryContenido = queryPCont.parse(contenido);
    
    
    busca.add(queryContenido, BooleanClause.Occur.MUST);
    
    TopScoreDocCollector collector = TopScoreDocCollector.create(100, true);    
    is.search(busca, collector);
    ScoreDoc[] hits = collector.topDocs().scoreDocs;
    
    
    long start = new Date().getTime();
   
    long end = new Date().getTime();
    System.out.println ("Se han encontrado " + hits.length +
      " documento(s) (en " + (end - start) +
      " millisegundos) relacionados con la palabra '" +
        contenido + "' en los directorios: ");
    for (int i = 0; i < hits.length; i++) {
    	Document hitDoc = is.doc(hits[i].doc);
      System.out.println(hitDoc.get("filename"));
      //arr.add(hitDoc.get("filename"));
      DatosArchivo da = new DatosArchivo();
      da.setNombArch(hitDoc.get("filename"));
      da.setAutor(hitDoc.get("Autor"));
      da.setFechaCreacion(hitDoc.get("Fecha"));
      da.setContenido(hitDoc.get("Contenido"));
      da.setTipoArch(hitDoc.get("Tipo"));
      System.out.println("Autor: "+da.getAutor()+" Fecha:"+da.getFechaCreacion());
      arr.add(da);
      //System.out.println(doc);
    }
    is.close();
    return arr;
  }
}
